#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
void init_queue(h_t* q1)
{
	assert(q1);
	q1->head = NULL;
	q1->tail = NULL;
	q1->sz = 0;
}
void destroy_queue(h_t* q1)
{
	assert(q1);
	Que* cur=q1->head;
	while (cur)
	{
		Que* next = cur->next;
		free(cur);
		cur = next;
	}
	q1->head = q1->tail = NULL;
	q1->sz = 0;
}
void push_queue(h_t* q1, QueDateType x)
{
	 Que* newnode=(Que*)malloc(sizeof(Que));
	 newnode->next = NULL;
	 newnode->a = x;
	 if (newnode == NULL)
	 {
		 perror("push_queue");
		 exit(-1);
	 }
	 if (q1->head == NULL)
	 {
		 q1->head = q1->tail = newnode;
	 }
	 else
	 {
		 q1->tail->next = newnode;
		 q1->tail = newnode;
	 }
	 q1->sz++;
}
void pop_queue(h_t* q1)
{
	assert(q1);
	assert(!queue_empty(q1));
	if (q1->head->next == NULL)
	{
		free(q1->head);
		q1->head = NULL;
		q1->tail = NULL;
	}
	else
	{
		Que* newhead = q1->head->next;
		free(q1->head);
		q1->head = newhead;
	}
	q1->sz--;
}
bool queue_empty(h_t*q1)
{
	assert(q1);
	return q1->sz == 0;
}
int size_queue(h_t* q1)
{
	assert(q1);
	return q1->sz;
}
QueDateType queue_front(h_t* q1)
{
	assert(q1);
	assert(!queue_empty(q1));
	return q1->head->a;
}
QueDateType queue_back(h_t* q1)
{
	assert(q1);
	assert(!queue_empty(q1));
	return q1->tail->a;
}
